え!? CloudFormation で既存リソースをインポートするときの “DeletionPolicy” って “Retain” じゃなくてもいいの!?
はじめに
CloudFormation で既存リソースをインポートするとき、インポートするリソースにはテンプレート上で DeletionPolicy 属性を指定する必要があります。
そして、DeletionPolicy 属性の値は "Retain" にする必要があると思っていました。
しかし、とある筋から、"Retain" じゃなくてもインポートできるよ!という情報を入手しました。「"DeletionPolicy" : "Delete"」や「"DeletionPolicy" : "Snapshot"」と指定してもインポート可能だと。 しかも、インポート機能がリリースされた当初からそうだというのです。
確かにドキュメントには、DeletionPolicy 属性が必要とは書いてあるものの、"Retain" にする必要があるとは書いてありません。
- 元のスタックリソースとインポートするリソースの両方を含む、スタック全体を記述するテンプレート。インポートする各リソースには、DeletionPolicy 属性が必要です。
既存リソースの CloudFormation 管理への取り込み
それでも、CloudFormation の既存リソースのインポート機能について書かれたブログ記事の多くで "DeletionPolicy" は "Retain" にする必要があると記載されており、半信半疑でした。
そんなときは、実際にやってみて確かめるのが一番!ということで、やってみました!
やってみた
1.「"DeletionPolicy" : "Delete"」でインポートしてみる
まず、下記のコマンドで RDS DB インスタンスを作成しました。
aws rds create-db-instance
--db-instance-identifier rds-mysql-for-cfn-import
--db-instance-class db.t3.micro
--allocated-storage 20
--storage-type gp2
--engine mysql
--engine-version 5.7.31
--master-username admin
--master-user-password xxxxxxxxxx
作成された直後の DB インスタンスにはタグがついていませんが、CloudFormation にインポートできたなら CloudFormation のタグが付くはずです。
次に、作成した DB インスタンスを CloudFormation にインポートするためのテンプレートを下記の内容で作成しました。"DeletionPolicy" には "Delete" を指定しています。
---
AWSTemplateFormatVersion: '2010-09-09'
Description: Import test
Resources:
ImportedRDS:
Type: AWS::RDS::DBInstance
DeletionPolicy: Delete
Properties:
AllocatedStorage: 20
StorageType: gp2
DBInstanceClass: db.t3.micro
DBInstanceIdentifier: rds-mysql-for-cfn-import
Engine: mysql
EngineVersion: 5.7.31
MasterUsername: admin
MasterUserPassword: xxxxxxxxxx
そして、インポートしてみたところ、、、
インポートできました!
リソースタブを確認すると、最初に作成した DB インスタンスがこのスタックのリソースになっていました。
念の為、使用したテンプレートの内容を確認すると、"DeletionPolicy" には間違いなく "Delete" が指定されています。
DB インスタンスのほうには、CloudFormation のタグがつきました。
「"DeletionPolicy" : "Delete"」で、問題なくインポートできましたね。。
なお、当然ではありますが、このスタックを削除すると DB インスタンスも削除されました。
誤削除を防ぐためには、"Retain" を指定したほうがいいですね。
2.「"DeletionPolicy" : "Snapshot"」でインポートしてみる
つづいて、"DeletionPolicy" に "Snapshot" を指定してもインポートできるのか、試してみました。
下記のコマンドで RDS DB インスタンスを作成しました。
aws rds create-db-instance
--db-instance-identifier rds-mysql-for-cfn-import-2
--db-instance-class db.t3.micro
--allocated-storage 20
--storage-type gp2
--engine mysql
--engine-version 5.7.31
--master-username admin
--master-user-password xxxxxxxxxx
作成された直後の DB インスタンスにはタグがついていませんが、CloudFormation にインポートできたなら CloudFormation のタグが付くはずです。
次に、作成した DB インスタンスを CloudFormation にインポートするためのテンプレートを下記の内容で作成しました。"DeletionPolicy" には "Snapshot" を指定しています。
---
AWSTemplateFormatVersion: '2010-09-09'
Description: Import test
Resources:
ImportedRDS:
Type: AWS::RDS::DBInstance
DeletionPolicy: Snapshot
Properties:
AllocatedStorage: 20
StorageType: gp2
DBInstanceClass: db.t3.micro
DBInstanceIdentifier: rds-mysql-for-cfn-import-2
Engine: mysql
EngineVersion: 5.7.31
MasterUsername: admin
MasterUserPassword: xxxxxxxxxx
そして、インポートしてみたところ、、、
インポートできました!
リソースタブを確認すると、作成した DB インスタンスがこのスタックのリソースになっていました。
念の為、使用したテンプレートの内容を確認すると、"DeletionPolicy" には間違いなく "Snapshot" が指定されています。
DB インスタンスのほうには、CloudFormation のタグがつきました。
「"DeletionPolicy" : "Snapshot"」で、問題なくインポートできましたね。。
そして、このスタックを削除すると DB インスタンスも削除されましたが、スナップショットが作成されました。
まとめ
やってみた結果、CloudFormation で既存リソースをインポートするときに指定する DeletionPolicy 属性の値は、"Retain" じゃなくてもいいということが確かめられました!
個人的には、この事実に結構な衝撃を受けたのですが、その後ドキュメント を確認したところ、ちゃんと書いてありました。。
インポートオペレーションを成功させるには、インポートする各リソースに
DeletionPolicy
属性が必要です。DeletionPolicy
は任意の使用できる値に設定できます。
もしや知らなかったのは自分だけ...?
教訓
ドキュメントはちゃんと読もう!